package com.jiuye.controller;

import com.jiuye.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.UUID;

/**
 * 文件上传下载
 *
 * @author likeWen
 * @since 2022/11/4 11:10
 */
@Slf4j
@RestController
@RequestMapping("/common")
public class CommonController {
    //根据注解拿到我们的配置文件中的内容
    /**
     * 文件上传后的保存路径
     * 1.yml文件配置上传路径
     */
    @Value("${reggie.path}")
    private String basePath;

    /**
     * 文件上传
     */
    @PostMapping("/upload")
    public R<String> upload(MultipartFile file) {
        //文件上传的时候，会先把文件保存到一个临时目录中
        //获取文件名
        String filename = file.getOriginalFilename();
        //获取后缀名
        //eg:abc.txt
        //拿到的是“.”最后一次出现的位置
        int index = filename.lastIndexOf(".");
        //文件名后缀  .txt
        String suffix = filename.substring(index);
        //使用UUID重新生成图片文件名，为了防止后续的文件名相同导致的覆盖问题
        String uuid = UUID.randomUUID().toString();
        //拼接一个新的文件名
        String newFilename = uuid + suffix;
        //创建图片保存的基本目录
        //new file的时候是不会在硬盘中真正的创建路径的
        //这里只是在内存中创建了file对象
        //如果在new file的时候就创建了我们指定的路径或者文件
        File dir = new File(basePath);
        //路径是不存在的
        //判断是否存在
        if (!dir.exists()) {
            //文件夹不存在，就创建这个文件夹
            dir.mkdirs();
        }
        //保存临时文件到图片目录下
        try {
            //文件转移
            //file ==> basePath路径下，且文件名是newFilename
            file.transferTo(new File(basePath, newFilename));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        //返回新图片文件名
        return R.success(newFilename);
    }

    /**
     * 文件下载
     */
    @GetMapping("/download")
    public void download(String name, HttpServletResponse response) {
        try {
            //1.定义输入流，通过输入流读取文件内容
            //根据输入读取文件
            File file = new File(basePath, name);
            //拿到我们要用的文件
            FileInputStream fileInputStream = new FileInputStream(file);
            //2.通过response对象设置相应数据格式（image/jpeg）
            //MediaType   Spring定义的枚举
            response.setContentType(MediaType.IMAGE_JPEG_VALUE);
            //3.通过response对象，获取到输出流
            ServletOutputStream outputStream = response.getOutputStream();
            //4.通过输入流读取文件数据，然后通过输出流写入浏览器
            //每次读取数据的长度
            int length = 0;
            //通常会通过每次往浏览器发送1KB的方式写回到浏览器中
            //这样可以避免如果返回大量数据的话，浏览器出问题
            byte[] bytes = new byte[1024];
            //fileInputStream.read 读取文件时，如果返回的是-1说明文件读取完了
            while ((length = fileInputStream.read(bytes)) != -1) {
                //写文件到浏览器中
                outputStream.write(bytes, 0, length);
                outputStream.flush();
            }
            //5.关闭资源
            fileInputStream.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

}
